var graphic = require("../../util/graphic");

var LineGroup = require("./Line");

/**
 * @module echarts/chart/helper/LineDraw
 */
function isPointNaN(pt) {
  return isNaN(pt[0]) || isNaN(pt[1]);
}

function lineNeedsDraw(pts) {
  return !isPointNaN(pts[0]) && !isPointNaN(pts[1]);
}
/**
 * @alias module:echarts/component/marker/LineDraw
 * @constructor
 */


function LineDraw(ctor) {
  this._ctor = ctor || LineGroup;
  this.group = new graphic.Group();
}

var lineDrawProto = LineDraw.prototype;
/**
 * @param {module:echarts/data/List} lineData
 */

lineDrawProto.updateData = function (lineData) {
  var oldLineData = this._lineData;
  var group = this.group;
  var LineCtor = this._ctor;
  var hostModel = lineData.hostModel;
  var seriesScope = {
    lineStyle: hostModel.getModel('lineStyle.normal').getLineStyle(),
    hoverLineStyle: hostModel.getModel('lineStyle.emphasis').getLineStyle(),
    labelModel: hostModel.getModel('label.normal'),
    hoverLabelModel: hostModel.getModel('label.emphasis')
  };
  lineData.diff(oldLineData).add(function (idx) {
    if (!lineNeedsDraw(lineData.getItemLayout(idx))) {
      return;
    }

    var lineGroup = new LineCtor(lineData, idx, seriesScope);
    lineData.setItemGraphicEl(idx, lineGroup);
    group.add(lineGroup);
  }).update(function (newIdx, oldIdx) {
    var lineGroup = oldLineData.getItemGraphicEl(oldIdx);

    if (!lineNeedsDraw(lineData.getItemLayout(newIdx))) {
      group.remove(lineGroup);
      return;
    }

    if (!lineGroup) {
      lineGroup = new LineCtor(lineData, newIdx, seriesScope);
    } else {
      lineGroup.updateData(lineData, newIdx, seriesScope);
    }

    lineData.setItemGraphicEl(newIdx, lineGroup);
    group.add(lineGroup);
  }).remove(function (idx) {
    group.remove(oldLineData.getItemGraphicEl(idx));
  }).execute();
  this._lineData = lineData;
};

lineDrawProto.updateLayout = function () {
  var lineData = this._lineData;
  lineData.eachItemGraphicEl(function (el, idx) {
    el.updateLayout(lineData, idx);
  }, this);
};

lineDrawProto.remove = function () {
  this.group.removeAll();
};

var _default = LineDraw;
module.exports = _default;